#include <stdio.h>  // 提供输入输出函数，如scanf、printf
#include <stdlib.h> // 提供qsort函数，用于排序

#define MAX_FILES 1000 // 假设最大文件数量
#define MAX_PRINTERS 5 // 最大打印机数量

typedef struct {
    int priority; // 文件的优先级
    int id;       // 文件的唯一编号
} File;

typedef struct {
    File queue[MAX_FILES]; // 存储打印队列的文件
    int size;              // 当前队列中的文件数量
} PrinterQueue;

// step 1#: 比较函数用于排序文件，按优先级降序，若优先级相同则按文件编号升序
int compareFiles(const void *a, const void *b) {
    File *file1 = (File *)a;
    File *file2 = (File *)b;
    if (file1->priority != file2->priority) {
        return file2->priority - file1->priority; // 按优先级降序排序
    } else {
        return file1->id - file2->id; // 优先级相同按文件ID升序排序
    }
}

// step 2#: 初始化打印机队列，设置每个打印机的文件队列大小为0
void initPrinterQueues(PrinterQueue printers[]) {
    for (int i = 0; i < MAX_PRINTERS; i++) {
        printers[i].size = 0; // 初始化每个打印机队列为空
    }
}

// step 3#: 向指定打印机队列中添加文件，并按优先级排序
void addFile(PrinterQueue *printer, int priority, int id) {
    printer->queue[printer->size].priority = priority; // 设置文件优先级
    printer->queue[printer->size].id = id;             // 设置文件ID
    printer->size++; // 增加队列大小

    // step 4#: 排序队列中的文件，确保优先级较高的文件排在前面
    qsort(printer->queue, printer->size, sizeof(File), compareFiles);
}

// step 5#: 从指定打印机队列中移除优先级最高的文件
int removeFile(PrinterQueue *printer) {
    if (printer->size == 0) {
        return -1; // 表示队列为空
    }
    int fileId = printer->queue[0].id; // 获取优先级最高文件的ID
    // step 6#: 移动队列中的文件，确保下一个文件排到队首
    for (int i = 1; i < printer->size; i++) {
        printer->queue[i - 1] = printer->queue[i]; // 文件后移
    }
    printer->size--; // 队列大小减1
    return fileId;   // 返回移除的文件ID
}

int main() {
    int count;
    scanf("%d", &count); // step 7#: 输入操作次数

    PrinterQueue printers[MAX_PRINTERS]; // step 8#: 创建打印机队列数组
    initPrinterQueues(printers); // step 9#: 初始化打印机队列

    int fileCount = 0; // step 10#: 文件总数计数器

    for (int i = 0; i < count; i++) {
        char operation[4]; // 存储操作类型
        int printerIndex, priority; // 存储打印机索引和文件优先级

        scanf("%s %d", operation, &printerIndex); // step 11#: 输入操作类型和打印机索引
        printerIndex--; // 转为0索引

        if (operation[0] == 'I') { // "IN" 操作，表示有文件进入队列
            scanf("%d", &priority); // step 12#: 输入文件的优先级
            fileCount++; // 增加文件总数
            addFile(&printers[printerIndex], priority, fileCount); // step 13#: 将文件加入指定打印机队列
        } else if (operation[0] == 'O') { // "OUT" 操作，表示从队列中移除文件
            int fileId = removeFile(&printers[printerIndex]); // step 14#: 从队列中移除文件
            if (fileId == -1) {
                printf("NULL\n"); // step 15#: 若队列为空，输出NULL
            } else {
                printf("%d\n", fileId); // step 16#: 输出移除的文件ID
            }
        }
    }

    return 0;
}
